from lexico import *
import constantes
import token

class Lexico:
    texto = ''
    ponteiro_inicial = 0
    
    def __init__(self, entrada):
        self.texto = entrada
    
    def executar(self, tabelaDeSimbolos):
        character = ''
        character_prox = ''
        buffer = ''
        pedaco = ''

        # passa por todos os caracteres do texto
        if self.ponteiro_inicial < len(self.texto):
            
            character = self.texto[self.ponteiro_inicial]
            if self.ponteiro_inicial + 1 < len(self.texto):
                character_prox = self.texto[self.ponteiro_inicial + 1]
            else:
                character_prox = ''
            
            while character == ' ' or character == '\n' or character == '\0' or character == '\t':
                if self.ponteiro_inicial + 1 < len(self.texto):
                    self.ponteiro_inicial += 1
                    character = self.texto[self.ponteiro_inicial]
                    if self.ponteiro_inicial + 1 < len(self.texto):
                        character_prox = self.texto[self.ponteiro_inicial + 1]
                    else:
                        character_prox = ''
                else:
                    break

            # verificar se e caracter
            if character.isalpha():
                buffer = character
                while character_prox.isalpha() or character_prox.isdigit() or character_prox == '_':
                     buffer += character_prox
                     self.ponteiro_inicial += 1
                     if self.ponteiro_inicial + 1 < len(self.texto):
                         character_prox = self.texto[self.ponteiro_inicial + 1]
                     else:
                         break
                # verifica se e palavra reservada
                if buffer  in constantes.listaPalavrasReservadas:
                    pedaco = token.Token(buffer,'Reservada', -1)
                else:
                    id = tabelaDeSimbolos.ProcurarSimbolo(buffer)
                    if id == None:
                        id = tabelaDeSimbolos.AdicionarSimbolo(buffer)
                    pedaco = token.Token(buffer,'Identificador', id)
                
            # verificar se e digito  
            elif character.isdigit():
                buffer = character
                while character_prox.isdigit():
                     buffer += character_prox
                     self.ponteiro_inicial += 1
                     if self.ponteiro_inicial + 1 < len(self.texto):
                         character_prox = self.texto[self.ponteiro_inicial + 1]
                     else:
                         break
                pedaco = token.Token(buffer,'Inteiro', -1)
                
            elif character == '%':
                character_prox == "";                
                while character_prox <> '%':                    
                    if self.ponteiro_inicial + 1 < len(self.texto):
                        self.ponteiro_inicial = self.ponteiro_inicial + 1
                        character_prox = self.texto[self.ponteiro_inicial]
                        print 'proximo:' + self.texto[self.ponteiro_inicial]
                    else:
                        break
            elif constantes.listaSimbolos.has_key(character):
                pedaco = token.Token(character,'Pontuacao', -1)
            else:
                print 'falha do lexico'
            self.ponteiro_inicial += 1
            
        
        if pedaco == '':
            return None
        else:
            return pedaco

    def FimDoArquivo(self):
        if len(self.texto) == self.ponteiro_inicial:
            return True
        else:
            return False
